﻿using CommunityToolkit.Mvvm.Messaging;
using myfirstmaui.Models;
using SQLite;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

//嵌入式数据库，SQL3.。。
//sqlite-net-pcl 使用GUI安装..(好像一个叶子)
//MYSQL -- DB模式..
//SQL3 -- code 

//1.安装.BootstrapBlazor 包..GUI安装..
//2,暗转.BootstrapBlazor.FontAwesome GUI安装..
//3.修改index.html <link rel="stylesheet" href="_content/BootstrapBlazor/css/bootstrap.blazor.bundle.min.css" />    
//    < link rel = "stylesheet" href = "_content/BootstrapBlazor.FontAwesome/css/font-awesome.min.css" />
//    < script src = "_content/BootstrapBlazor/js/bootstrap.blazor.bundle.min.js" ></ script >
//4.打开MauiProgram.cs  builder.Services.AddBootstrapBlazor();
//5.打开_ 添加_Imports @using BootstrapBlazor.Components
//6 打开 round..net7不是round.是main <BootstrapBlazorRoot> / <BootstrapBlazorRoot>
//7.每个项目有自己的GUID.. -- 在保存的时候，WIN下就有一个GUID目录，可是你调试的时候，在内存看到的
//不是这个目录..微软使用了一个移花接木的方法. 让开发者懵逼了.(新标准)
// 如果你想看SQL3 -- 可以安装一个工具的.
//里面有2个表，一个自己的，一个系统的.
// 这里有个BUG，在WIN里面好，在安卓不行，点创建，安卓崩溃..为什么.
//MAUI 底层有个东西有问题，要安装一个额外的包..
//SQLitePCLRaw.provider.dynamic_cdecl -- 要安装，这样在安卓下面就OK了..(补丁1)--这个一定要注意，安装错了，你SQL3都不能使用，直接报错..
//1万 拆表 .. 10万 拆库. 拆数据中心.
//8.安装一个依赖包，所有的都安装了..
//9.添加导航.. 直接加，名称要一样，大小写忽略..
//10 在网络上和其他服务器, 
//   1.https://v2.jinrishici.com/sentence -- 得到一个TOKEN.
//   2.在访问一次.. 在HTTP头里面设置第一次得到的TOKEN.
//使用GIT看不懂，我自己怎么对的，我自己都不知道，反正就OK了..
//以后使用GIT都要怎么样呢？都要 -- 先拉一下...

//1. https://v2.jinrishici.com/token 
//2. "data": "DP/83yvJAKMFQ0e3whANHWxQSldssDHi"
//"status": "success",
//"data": "DP/83yvJAKMFQ0e3whANHWxQSldssDHi" -- 每个客户端不一样.
//编辑 -- 选择性粘贴，JSON便类..
//3. 给你一个TOKEN。。 一个用户一个，你可以保持 。。
// 老师跳读好大..
// 1.DNS.. - 郁闷便IP.(拦截. 修改HOST.. 我来解析.)
// 2.https:443 -- 3. 返回了json..
//所有的HTTPS网站必须有证书，证书必须是 微软.
//我们现在是一个图片，2精致的图片文件，我们下现在是个浏览器.
//我们现在怎么吧这个图片搞到浏览器上面呢？浏览器不是要2紧张，要一个地址..
//情况1. <p> <img src=....>这样可以显示图片，问题是，我们不是地址.
//我们有URL为什么不使用情况1呢？因为如果使用情况1每次都要去服务器加载.
//2.我们设计的是下载到本地，下载不是白设计了吗？
//这里我又有新的理解了，这个好像是，C#代码就是服务器.. HTTP代码就是浏览器.
//怎么去理解@code -- 就是服务器，我这里的服务器，是本地的服务器，理解为，一个APP里面有一个服务器..
//1个APP 很复制呀 。。 有服务器段，有浏览器段，还有JS段..

//application android:usesCleartextTraffic="true" -- 安卓9以上需要加这个..要不然无法访问HTTP..

namespace myfirstmaui.Base
{
    static class Tools
    {
        public const string FileName = "todayImage.bin";
        public static readonly string ImagePath =
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), FileName);

        //public const string DbName = "userdb.sqlite3";
        //数据库路径
        //public static readonly string userDbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), DbName);

        //private SQLiteAsyncConnection _connection;

        //private SQLiteAsyncConnection Connection => _connection ??= new SQLiteAsyncConnection(userDbPath);

        //得到数据.
        //public async Task<User> GetPoetryAsync(int id) => await Connection.Table<User>().Where(p => p.Id == id).FirstOrDefaultAsync();


        //public async Task initializeAsync()
        //{
        //创建的时候,他会去判断.. 你的字段..搞3个列出来..
        //SQ3 是没有类型一说的..
        //C#约定.. 函数后Async,就是已补. 已补前面要AWAIT..
        //这里就是，没有就创建.有就算了..
        //如果不加能执行，不正常..
        //await Connection.CreateTableAsync<User>();
        //}

        //保存1个数据..
        //public async Task SavePoetryAsync(User p) => await Connection.InsertAsync(p);

        //得到多        
        //个数据..
        //public async Task<IEnumerable<User>> SearchByNameAsync(string name) => await Connection.Table<User>() .Where(p => p.Name.Contains(name)) .ToListAsync();

        public static int Get(string key, int defalut)
        {
            return Preferences.Get(key, defalut);
        }

        public static void Set(string key, int value)
        {
            Preferences.Set(key, value);
        }

        public static string Get(string key, string value)
        {
            return Preferences.Get(key, value);
        }

        public static void Set(string key, string value)
        {
            Preferences.Set(key, value);
        }

        //下载图片..
        public static async Task<Stream> LoadImageAsync(string strurl)
        {            
            HttpClient httpClient = new HttpClient();
            try
            {
                return await httpClient.GetStreamAsync(strurl);                
            }
            catch (Exception ex) { throw; }            
        }

        //保持图片到硬盘..
        public async static Task SaveTodayImageAsync(TodayImage todayImage, bool savingExpiresAtoOnly)
        {
            await using var imageFileStream = new FileStream(ImagePath, FileMode.Create);
            await imageFileStream.WriteAsync(todayImage.ImageBytes, 0, todayImage.ImageBytes.Length);
        }

        public async static Task<TodayImage> GetTodayImageAsync(bool includingImageStram)
        {
            TodayImage todayImage = new TodayImage();

            if (!File.Exists(ImagePath))
            {
                await using var imageAssetFileStream =
                    new FileStream(ImagePath, FileMode.Create) ??
                    throw new NullReferenceException("NULL file stream.");
                await using var imageAssetStream =
                    typeof(Tools).Assembly.GetManifestResourceStream(FileName) ??
                    throw new NullReferenceException("NULL manifest stream.");
                //吧资源拷被给什么，给文件..                
                await imageAssetFileStream.CopyToAsync(imageAssetStream);
            }

            if (!includingImageStram)
            {
                return todayImage;
            }

            //吧资源变成数组.
            var imageMemoryStream = new MemoryStream();
            await using var imageFileStream = new FileStream(ImagePath, FileMode.Open);
            await imageFileStream.CopyToAsync(imageMemoryStream);
            todayImage.ImageBytes = imageMemoryStream.ToArray();
            return todayImage;
        }

        public async static Task<bbreportstandardTable[]> GetServerbbreportstandardAsync()
        {
            HttpResponseMessage response;
            using var httpClient = new HttpClient();            
            try
            {
                response = await httpClient.GetAsync("http://twjgod.w1.luyouxia.net/api/Test");//异常，网站变了.
                response.EnsureSuccessStatusCode();
                var json = await response.Content.ReadAsStringAsync(); //得到返回字符串.--
                var jsontoken = JsonSerializer.Deserialize<bbreportstandardTable[]>(json); //字符串转类. -- 异常. 数据结构便了.
                return jsontoken;
            }
            catch (Exception ex) { throw; }
        }
    }
}
